'''
Future 对象
一个 Future 代表一个异步运算的结果，线程不安全。

Task 对象
Task 对象的作用是在运行某个任务的同时可以并发的运行其他任务

Task 对象可以使用 asyncio.create_task() 函数创建，也可以使用 loop.create_task() 和 asyncio.ensure_future() 函数创建，不建议实例化 Task对象
'''
import asyncio,time,functools
# todo 运行协程
# async def do_work():
#     print("Hello....")
#     # 模拟阻塞1秒
#     await asyncio.sleep(1)
#     print("world...")
#
# coroutine = do_work()
# print(coroutine)
# # 创建一个事件event_loop
# loop = asyncio.get_event_loop()
# # 将协程加入到event_loop中，并运行
# loop.run_until_complete(coroutine)

# todo 运行 Task
# async def do_work():
#     print("这是一个Task例子....")
#     # 模拟阻塞1秒
#     await asyncio.sleep(3)
#     return "Task任务完成"
#
# # 创建一个事件event_loop
# loop = asyncio.get_event_loop()
# # 创建一个task
# task = loop.create_task(do_work())
# # 第一次打印task
# print(task)
# # 将task加入到event_loop中
# loop.run_until_complete(task)
# # 再次打印task
# print(task)
# print(task.result())

# todo Task 任务回调
# async def do_work():
#     print("这是一个Task例子....")
#     # 模拟阻塞1秒
#     await asyncio.sleep(3)
#     return "Task任务完成"
#
# # 任务完成后的回调函数
# def callback(task):
#     # 打印参数
#     print(task)
#     # 打印返回的结果
#     print(task.result())
#
# # 创建一个事件event_loop
# loop = asyncio.get_event_loop()
#
# # 创建一个task
# task = loop.create_task(do_work())
# task.add_done_callback(callback)
#
# # 将task加入到event_loop中
# loop.run_until_complete(task)

# todo 并发任务
# async def do_work(t):
#     print("暂停" + str(t) + "秒")
#     # 模拟阻塞1秒
#     await asyncio.sleep(t)
#     return "暂停了" + str(t) + "秒"
#
#
# # 任务完成后的回调函数
# def callback(future):
#     # 打印返回的结果
#     print(future.result())
#
#
# # 创建一个事件event_loop
# loop = asyncio.get_event_loop()
#
# tasks = []
# i = 0
# while i <= 4:
#     task = loop.create_task(do_work(i))
#     task.add_done_callback(callback)
#     tasks.append(task)
#     i += 1;
#
# # 计时
# now = lambda :time.time()
# start = now()
# # 将task加入到event_loop中
# loop.run_until_complete(asyncio.wait(tasks))
#
# end = now()
# print("总共用时间:",end-start)

# todo 同一个回调
'''
loop.run_forever() 函数 和 loop.run_until_complete() 函数 并不相同，run_until_complete() 函数在执行后事件循环被停止，
run_forever() 函数在 Task 任务执行完成后事件循环并没有被终止，在回调函数 callback() 中使用 loop.stop() 函数将事件循环停止
'''
async def do_work(t):
    print("暂停" + str(t) + "秒")
    await asyncio.sleep(t)
    return "暂停了" + str(t) + "秒"


def callback(loop, gatheringFuture):
    print(gatheringFuture)
    print("多个Task任务完成后的回调")
    loop.stop()

loop = asyncio.get_event_loop()

gather = asyncio.gather(do_work(1), do_work(3))
gather.add_done_callback(functools.partial(callback, loop))

loop.run_forever()

# asyncio 在协程、网络爬虫等多种耗时操作时程序不再需要等待其他任务完成，节约大量的时间。